package com.gitee.wsl.struct.table.mini



/**
 * 区域类，表示一块区域
 */
class Area :  Comparable<Area>{

    /**
     * 设置起始行号
     *
     * @param r
     * int 行号
     */
    /** 起始行号，结束行号  */
    var beginRow: Int = -1

    /**
     * 设置结束行号
     *
     * @param r
     * int
     */
    var endRow: Int = -1

    /**
     * 设置起始列号
     *
     * @param c
     * int
     */
    /** 起始列号，结束列号  */
    var beginCol: Int = -1

    /**
     * 设置结束列号
     *
     * @param c
     * int
     */
    var endCol: Int = -1

    constructor()

    /**
     * 构造函数
     *
     * @param r1
     * int 起始行号
     * @param r2
     * int 结束行号
     */
    constructor(r1: Int, r2: Int) {
        this.beginRow = r1
        this.endRow = r2
    }

    /**
     * 构造函数
     *
     * @param r1
     * int 起始行号
     * @param c1
     * int 起始列号
     * @param r2
     * int 结束行号
     * @param c2
     * int 结束列号
     */
    constructor(r1: Int, c1: Int, r2: Int, c2: Int) {
        this.beginRow = r1
        this.endRow = r2

        this.beginCol = c1
        this.endCol = c2
    }

    fun setArea(br: Int, bc: Int, er: Int, ec: Int) {
        this.beginRow = br
        this.endRow = er
        this.beginCol = bc
        this.endCol = ec
    }

    /**
     * 与另一个区域对象进行比较，依次比较起始行、起始列、结束行、结束列， 若比较过程中存在不相等则返回其差，否则返回0
     *
     * @param other
     * Area
     * @return int
     */
    override fun compareTo(other: Area): Int {
        var x = beginRow - other.beginRow
        if (x != 0) {
            return x
        }
        x = beginCol - other.beginCol
        if (x != 0) {
            return x
        }
        x = endRow - other.endRow
        if (x != 0) {
            return x
        }
        return endCol - other.endCol
    }

    /**
     * 判断row,col是否在当前区域内
     *
     * @param row
     * int
     * @param col
     * int
     * @return boolean
     */
    fun contains(row: Int, col: Int): Boolean {
        return (row in beginRow..endRow && beginCol <= col && endCol >= col)
    }

    /**
     * 是否包含另一区域
     *
     * @param a
     * Area
     * @return boolean
     */
    fun contains(a: Area): Boolean {
        return (contains(a.beginRow, a.beginCol)
                && contains(a.endRow, a.endCol)
                && contains(a.beginRow, a.endCol)
                && contains(a.endRow, a.beginCol))
    }

    companion object {

        /** 列类型由short改成了int  */
        private const val version = 2.toByte()
    }
}